<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        
    </style>
</head>
<body>
    
</body>
<script>
    
    // 需求：

    // 计算n的阶乘

    // 5! = 5*4*3*2*1
    //      5 * 4!=4*3*2*1
    //          4 * 3!=3*2*1
    //              3 * 2!=2*1
    //                  2*1!=1
    //                    1

    // 假设已经有一个函数fn已经可以计算阶乘了
    // fn(1) = 1
    // fn(2) = 2 * fn(1)
    // fn(3) = 3 * fn(2)
    // fn(4) = 4 * fn(3)
    // fn(n) = n * fn(n-1)
    // 如果每次函数执行都在返回数据，那么形成了以下的局面
    // fn(1) = 1
    // fn(2) = 2 * 1
    // fn(3) = 3 * 2
    // fn(4) = 4 * 6
    // fn(n) = n * fn(n-1)

    // function fn(n){
    //     if(n === 1){
    //         return 1;
    //     }
    //     return n * fn(n-1);
    // }

    // console.log( fn(4) );

    // 递
    // 第一次：fn(4)，开启了第二次执行
    // 第二次：fn(3)，开启了第三次执行
    // 第三次：fn(2)，开启了第四次执行
    // 第四次：fn(1)，开启了第五次执行
    // 第五次：符合条件 1，停止开启，准备归

    // 归
    // 第五次执行，给第四次归了个 1
    // 第四次执行拿到归来的 1，进行 2*1 的计算，得到 2，给第三次归了个2
    // 第三次执行拿到归来的 2，进行 3*2 的计算，得到 6，给第二次归了个6
    // 第二次执行拿到归来的 6，进行 4*6 的计算，得到 24，给第一次归了个24

    // 24就是最终结果



    // ===========


    // 计算两个数字的最大公约数

    // 约数：可以被整除的数字
    // 公约数：可以被多个数字共同整除的数字
    // 最大公约数：可以被多个数字共同整除的最大数字

    // 最大公约数：辗转相除法
    // r = num1 % num2
    // r = num2 % r
    // r === 0
    // num2为最大公约数

    // fn( 15, 27 );

    // function fn(n, m){
    //     var r = n % m;
    //     if(r === 0){
    //         return m;
    //     }else{
    //         return fn( m, r );
    //     }
    // }

    // console.log(fn( 49, 42 ))




    // ===========



    // 斐波那契数列（兔子问题）
    // 1,1,2,3,5,8,13,21,34,55
    // 从第三位开始，每位是前两位的和

    // 使用递归计算第n位是多少？？







</script>
</html>